#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
邮箱配置快速设置脚本
帮助用户快速配置邮箱信息
"""

import os
import re
from datetime import datetime


def print_welcome():
    """打印欢迎信息"""
    print("=" * 60)
    print("📧 新闻日报邮箱配置向导")
    print("=" * 60)
    print("本向导将帮助您配置新闻日报的邮箱设置")
    print("=" * 60)


def validate_email(email):
    """验证邮箱格式"""
    pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    return re.match(pattern, email) is not None


def get_qq_auth_code_guide():
    """显示QQ邮箱授权码获取指南"""
    print("\n📋 QQ邮箱授权码获取指南:")
    print("-" * 40)
    print("1. 登录QQ邮箱 (https://mail.qq.com)")
    print("2. 点击右上角'设置' -> '账户'")
    print("3. 找到'POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务'")
    print("4. 开启'IMAP/SMTP服务'")
    print("5. 按照提示获取授权码（不是QQ密码！）")
    print("6. 将授权码复制到下面的输入框中")
    print("-" * 40)


def setup_email_config():
    """设置邮箱配置"""
    print("\n🔧 开始配置邮箱信息...")
    
    # 获取发送邮箱
    while True:
        sender_email = input("\n请输入发送邮箱 (QQ邮箱): ").strip()
        if not sender_email:
            print("❌ 邮箱地址不能为空")
            continue
        
        if not validate_email(sender_email):
            print("❌ 邮箱格式不正确")
            continue
        
        if not sender_email.endswith('@qq.com'):
            print("⚠️  建议使用QQ邮箱，其他邮箱可能需要不同的SMTP设置")
            confirm = input("是否继续? (y/n): ").strip().lower()
            if confirm not in ['y', 'yes', '是']:
                continue
        
        break
    
    # 显示授权码获取指南
    get_qq_auth_code_guide()
    
    # 获取授权码
    while True:
        sender_password = input("\n请输入邮箱授权码: ").strip()
        if not sender_password:
            print("❌ 授权码不能为空")
            continue
        
        if len(sender_password) < 10:
            print("⚠️  授权码通常较长，请确认输入正确")
            confirm = input("是否继续? (y/n): ").strip().lower()
            if confirm not in ['y', 'yes', '是']:
                continue
        
        break
    
    # 获取接收邮箱
    while True:
        recipient_email = input("\n请输入接收邮箱 (默认: 505735255@qq.com): ").strip()
        if not recipient_email:
            recipient_email = "505735255@qq.com"
            break
        
        if not validate_email(recipient_email):
            print("❌ 邮箱格式不正确")
            continue
        
        break
    
    # 获取发送时间
    while True:
        send_time = input("\n请输入发送时间 (格式: HH:MM，默认: 08:00): ").strip()
        if not send_time:
            send_time = "08:00"
            break
        
        # 验证时间格式
        time_pattern = r'^([01]?[0-9]|2[0-3]):[0-5][0-9]$'
        if not re.match(time_pattern, send_time):
            print("❌ 时间格式不正确，请使用 HH:MM 格式")
            continue
        
        break
    
    # 获取最大新闻数
    while True:
        max_news = input("\n请输入每日最大新闻数 (默认: 8): ").strip()
        if not max_news:
            max_news = "8"
            break
        
        try:
            max_news_int = int(max_news)
            if max_news_int < 1 or max_news_int > 20:
                print("❌ 新闻数量应在1-20之间")
                continue
        except ValueError:
            print("❌ 请输入有效的数字")
            continue
        
        break
    
    return {
        'sender_email': sender_email,
        'sender_password': sender_password,
        'recipient_email': recipient_email,
        'send_time': send_time,
        'max_news_items': max_news
    }


def update_config_file(config):
    """更新配置文件"""
    print("\n💾 正在更新配置文件...")
    
    config_content = f'''#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
邮箱配置文件
自动生成于 {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
"""

# ==================== 邮箱配置 ====================

# 发送邮箱配置
SENDER_EMAIL = "{config['sender_email']}"
SENDER_PASSWORD = "{config['sender_password']}"

# 接收邮箱配置
RECIPIENT_EMAIL = "{config['recipient_email']}"

# ==================== RSS配置 ====================

# RSS新闻源地址
RSS_URL = "https://rss.aishort.top/?type=36kr"

# ==================== 定时任务配置 ====================

# 发送时间 (24小时制，格式: HH:MM)
SEND_TIME = "{config['send_time']}"

# 最大新闻条目数
MAX_NEWS_ITEMS = {config['max_news_items']}

# ==================== 其他配置 ====================

# 是否启用日志记录
ENABLE_LOGGING = True

# 日志文件目录
LOG_DIR = "logs"

# 是否在发送失败时重试
ENABLE_RETRY = True

# 重试次数
MAX_RETRY_COUNT = 3

# 重试间隔（秒）
RETRY_INTERVAL = 300  # 5分钟


def validate_config():
    """验证配置是否完整"""
    errors = []
    
    if not SENDER_EMAIL:
        errors.append("请设置发送邮箱地址")
    
    if not SENDER_PASSWORD:
        errors.append("请设置邮箱授权码")
    
    if not RECIPIENT_EMAIL:
        errors.append("请设置接收邮箱地址")
    
    if not RSS_URL:
        errors.append("请设置RSS源地址")
    
    if not SEND_TIME:
        errors.append("请设置发送时间")
    
    return errors


def get_config_info():
    """获取配置信息摘要"""
    return {{
        "sender_email": SENDER_EMAIL,
        "recipient_email": RECIPIENT_EMAIL,
        "rss_url": RSS_URL,
        "send_time": SEND_TIME,
        "max_news_items": MAX_NEWS_ITEMS,
        "config_valid": len(validate_config()) == 0
    }}


if __name__ == "__main__":
    # 配置验证
    errors = validate_config()
    
    if errors:
        print("❌ 配置验证失败:")
        for error in errors:
            print(f"  - {{error}}")
        print("\\n请修改 email_config.py 文件中的配置")
    else:
        print("✅ 配置验证通过")
        print("\\n当前配置:")
        info = get_config_info()
        for key, value in info.items():
            if key != "config_valid":
                print(f"  {{key}}: {{value}}")
'''
    
    try:
        with open('email_config.py', 'w', encoding='utf-8') as f:
            f.write(config_content)
        
        print("✅ 配置文件已更新")
        return True
        
    except Exception as e:
        print(f"❌ 更新配置文件失败: {e}")
        return False


def show_next_steps():
    """显示后续步骤"""
    print("\n🎉 配置完成！")
    print("=" * 60)
    print("📋 后续步骤:")
    print("1. 运行测试: python test_email.py")
    print("2. 启动服务: python start_daily_news.py")
    print("3. 查看日志: logs/ 目录")
    print("=" * 60)
    print("💡 提示:")
    print("- 服务将在每天指定时间自动发送新闻日报")
    print("- 按 Ctrl+C 可以停止服务")
    print("- 如有问题，请检查日志文件")


def main():
    """主函数"""
    print_welcome()
    
    # 检查是否已有配置文件
    if os.path.exists('email_config.py'):
        print("\n⚠️  检测到已有配置文件")
        overwrite = input("是否重新配置? (y/n): ").strip().lower()
        if overwrite not in ['y', 'yes', '是']:
            print("配置取消")
            return
    
    # 设置邮箱配置
    config = setup_email_config()
    
    # 显示配置摘要
    print("\n📋 配置摘要:")
    print("-" * 40)
    print(f"发送邮箱: {config['sender_email']}")
    print(f"接收邮箱: {config['recipient_email']}")
    print(f"发送时间: 每天 {config['send_time']}")
    print(f"最大新闻数: {config['max_news_items']}")
    print("-" * 40)
    
    # 确认配置
    confirm = input("\n确认保存配置? (y/n): ").strip().lower()
    if confirm not in ['y', 'yes', '是']:
        print("配置取消")
        return
    
    # 更新配置文件
    if update_config_file(config):
        show_next_steps()
    else:
        print("❌ 配置保存失败")


if __name__ == "__main__":
    main()
